--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LXST/Platforms/android/soundcard.py 0.4.7 (cdaf47c2) Text, 43.20 KB
T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.
Tff7b72import T7ee787atexit
Tff7b72import T7ee787collectionsT7ee787.T7ee787abc
Tff7b72import T7ee787time
Tff7b72import T7ee787re
Tff7b72import T7ee787threading
Tff7b72import T7ee787numpy
Tff7b72import T7ee787RNS
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffget_platformTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72from T7ee787jnius Tff7b72import Te6edf3autoclassTb4b4b4, Te6edf3cast
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould load module for native Java interface access on Android: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72raise Te6edf3e
Tff7b72class T56d364_AndroidAudioTb4b4b4:
Te6edf3COMMUNICATION_MODE_TYPES Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffInternal EarpieceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffBluetooth SCOTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffBLE HeadsetTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffHearing AidTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffWired HeadphonesTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffWired HeadsetTa5d6ff"Tb4b4b4]
Te6edf3IGNORED_DEVICE_TYPES Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffTelephonyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffRemote SubmixTa5d6ff"Tb4b4b4]
Te6edf3ADD_VIRT_RINGER_TYPES Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffInternal SpeakerTa5d6ff"Tb4b4b4]
Te6edf3DEFAULT_SINK Tff7b72= Ta5d6ff"Ta5d6ffInternal SpeakerTa5d6ff"
Te6edf3FALLBACK_SINKS Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffInternal SpeakerTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffRinger SpeakerTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffHearing AidTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffWired HeadsetTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffUSB HeadsetTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffBLE HeadsetTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffBluetooth SCOTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffBLE SpeakerTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffBluetooth A2DPTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffWired HeadphonesTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffAnalog LineTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffDigital LineTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffUSB DeviceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffUSB AccessoryTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffHDMITa5d6ff"Tb4b4b4]
Te6edf3DEFAULT_SOURCE Tff7b72= Ta5d6ff"Ta5d6ffInternal MicrophoneTa5d6ff"
Te6edf3FALLBACK_SOURCES Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffInternal MicrophoneTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffHearing AidTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffWired HeadsetTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffUSB HeadsetTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffBLE HeadsetTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffBluetooth SCOTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffAnalog LineTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffDigital LineTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffUSB DeviceTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffUSB AccessoryTa5d6ff"Tb4b4b4]
Te6edf3VIRTUAL_DEVICE_OFFSET Tff7b72= T79c0ff0xFFFF
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_client_name Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffavailable_devices Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffandroid_api_version Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffandroid_api_version Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.os.Build$VERSIONTa5d6ff'Tb4b4b4)Tff7b72.Td2a8ffSDK_INT
Te6edf3Context Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.content.ContextTa5d6ff'Tb4b4b4)
Te6edf3activity Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6fforg.kivy.android.PythonActivityTa5d6ff'Tb4b4b4)Tff7b72.Td2a8ffmActivity
Tff7b72if Te6edf3activity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not obtain application context, instance may be running in a service context.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3android_service Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6fforg.kivy.android.PythonServiceTa5d6ff'Tb4b4b4)Tff7b72.Td2a8ffmService
Te6edf3activity Tff7b72= Te6edf3android_serviceTff7b72.Td2a8ffgetApplicationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffgetApplicationContextTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3activity Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSuccessfully obtained application context from serviceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Te6edf3activity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFailed to obtain application context for audio stream acquisitionTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo application context available for audio stream acquisitionTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffAudioManager Tff7b72= Te6edf3activityTff7b72.Td2a8ffgetSystemServiceTb4b4b4(Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.AudioManagerTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffAudioDeviceInfo Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.AudioDeviceInfoTa5d6ff"Tb4b4b4)
Te6edf3adi Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioDeviceInfo
T8b949e# Populate device type descriptions from JNI
Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptions Tff7b72= Tb4b4b4{
Te6edf3adiTff7b72.Td2a8ffTYPE_AUX_LINETb4b4b4: Ta5d6ff"Ta5d6ffAux LineTa5d6ff"Tb4b4b4, T8b949e# 0x13 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_BLUETOOTH_A2DPTb4b4b4: Ta5d6ff"Ta5d6ffBluetooth A2DPTa5d6ff"Tb4b4b4, T8b949e# 0x08 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_BLUETOOTH_SCOTb4b4b4: Ta5d6ff"Ta5d6ffBluetooth SCOTa5d6ff"Tb4b4b4, T8b949e# 0x07 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_BUILTIN_EARPIECETb4b4b4: Ta5d6ff"Ta5d6ffInternal EarpieceTa5d6ff"Tb4b4b4, T8b949e# 0x01 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_BUILTIN_MICTb4b4b4: Ta5d6ff"Ta5d6ffInternal MicrophoneTa5d6ff"Tb4b4b4, T8b949e# 0x0f - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_BUILTIN_SPEAKERTb4b4b4: Ta5d6ff"Ta5d6ffInternal SpeakerTa5d6ff"Tb4b4b4, T8b949e# 0x02 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_DOCKTb4b4b4: Ta5d6ff"Ta5d6ffDockTa5d6ff"Tb4b4b4, T8b949e# 0x0d - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_FMTb4b4b4: Ta5d6ff"Ta5d6ffFMTa5d6ff"Tb4b4b4, T8b949e# 0x0e - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_FM_TUNERTb4b4b4: Ta5d6ff"Ta5d6ffFM TunerTa5d6ff"Tb4b4b4, T8b949e# 0x10 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_HDMITb4b4b4: Ta5d6ff"Ta5d6ffHDMITa5d6ff"Tb4b4b4, T8b949e# 0x09 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_HDMI_ARCTb4b4b4: Ta5d6ff"Ta5d6ffHDMI ARCTa5d6ff"Tb4b4b4, T8b949e# 0x0a - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_IPTb4b4b4: Ta5d6ff"Ta5d6ffIPTa5d6ff"Tb4b4b4, T8b949e# 0x14 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_LINE_ANALOGTb4b4b4: Ta5d6ff"Ta5d6ffAnalog LineTa5d6ff"Tb4b4b4, T8b949e# 0x05 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_LINE_DIGITALTb4b4b4: Ta5d6ff"Ta5d6ffDigital LineTa5d6ff"Tb4b4b4, T8b949e# 0x06 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_TELEPHONYTb4b4b4: Ta5d6ff"Ta5d6ffTelephonyTa5d6ff"Tb4b4b4, T8b949e# 0x12 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_TV_TUNERTb4b4b4: Ta5d6ff"Ta5d6ffTV TunerTa5d6ff"Tb4b4b4, T8b949e# 0x11 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_UNKNOWNTb4b4b4: Ta5d6ff"Ta5d6ffUnknownTa5d6ff"Tb4b4b4, T8b949e# 0x00 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_USB_ACCESSORYTb4b4b4: Ta5d6ff"Ta5d6ffUSB AccessoryTa5d6ff"Tb4b4b4, T8b949e# 0x0c - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_USB_DEVICETb4b4b4: Ta5d6ff"Ta5d6ffUSB DeviceTa5d6ff"Tb4b4b4, T8b949e# 0x0b - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_WIRED_HEADPHONESTb4b4b4: Ta5d6ff"Ta5d6ffWired HeadphonesTa5d6ff"Tb4b4b4, T8b949e# 0x04 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_WIRED_HEADSETTb4b4b4: Ta5d6ff"Ta5d6ffWired HeadsetTa5d6ff"Tb4b4b4, T8b949e# 0x03 - API level 23
Te6edf3adiTff7b72.Td2a8ffTYPE_BUSTb4b4b4: Ta5d6ff"Ta5d6ffBusTa5d6ff"Tb4b4b4, T8b949e# 0x15 - API level 24
Tb4b4b4}
Tff7b72if Tff7b72selfTff7b72.Td2a8ffandroid_api_version Tff7b72>Tff7b72= T79c0ff26Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptionsTb4b4b4[Te6edf3adiTff7b72.Td2a8ffTYPE_USB_HEADSETTb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffUSB HeadsetTa5d6ff" T8b949e# 0x16 - API level 26
Tff7b72if Tff7b72selfTff7b72.Td2a8ffandroid_api_version Tff7b72>Tff7b72= T79c0ff28Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptionsTb4b4b4[Te6edf3adiTff7b72.Td2a8ffTYPE_HEARING_AIDTb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffHearing AidTa5d6ff" T8b949e# 0x17 - API level 28
Tff7b72if Tff7b72selfTff7b72.Td2a8ffandroid_api_version Tff7b72>Tff7b72= T79c0ff30Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptionsTb4b4b4[Te6edf3adiTff7b72.Td2a8ffTYPE_BUILTIN_SPEAKER_SAFETb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffRinger SpeakerTa5d6ff" T8b949e# 0x18 - API level 30
Tff7b72if Tff7b72selfTff7b72.Td2a8ffandroid_api_version Tff7b72>Tff7b72= T79c0ff31Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptionsTb4b4b4[Te6edf3adiTff7b72.Td2a8ffTYPE_BLE_HEADSETTb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffBLE HeadsetTa5d6ff" T8b949e# 0x1a - API level 31
Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptionsTb4b4b4[Te6edf3adiTff7b72.Td2a8ffTYPE_BLE_SPEAKERTb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffBLE SpeakerTa5d6ff" T8b949e# 0x1b - API level 31
Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptionsTb4b4b4[Te6edf3adiTff7b72.Td2a8ffTYPE_HDMI_EARCTb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffHDMI EARCTa5d6ff" T8b949e# 0x1d - API level 31
Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptionsTb4b4b4[Te6edf3adiTff7b72.Td2a8ffTYPE_REMOTE_SUBMIXTb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffRemote SubmixTa5d6ff" T8b949e# 0x19 - API level 31
Tff7b72if Tff7b72selfTff7b72.Td2a8ffandroid_api_version Tff7b72>Tff7b72= T79c0ff33Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptionsTb4b4b4[Te6edf3adiTff7b72.Td2a8ffTYPE_BLE_BROADCASTTb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffBLE BroadcastTa5d6ff" T8b949e# 0x1e - API level 33
Tff7b72if Tff7b72selfTff7b72.Td2a8ffandroid_api_version Tff7b72>Tff7b72= T79c0ff34Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptionsTb4b4b4[Te6edf3adiTff7b72.Td2a8ffTYPE_DOCK_ANALOGTb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffAnalog DockTa5d6ff" T8b949e# 0x1f - API level 34
Tff7b72if Tff7b72selfTff7b72.Td2a8ffandroid_api_version Tff7b72>Tff7b72= T79c0ff36Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptionsTb4b4b4[Te6edf3adiTff7b72.Td2a8ffTYPE_MULTICHANNEL_GROUPTb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffMultichannel GroupTa5d6ff" T8b949e# 0x20 - API level 36
Te6edf3added_ids Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3found_ringer Tff7b72= Tff7b72False
Te6edf3virtual_ringers Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Tff7b72selfTff7b72.Td2a8ffandroid_api_version Tff7b72< T79c0ff31Tb4b4b4: Te6edf3available_devices Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3available_devices Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffgetAvailableCommunicationDevicesTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3device Tff7b72in Te6edf3available_devicesTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3device_id Tff7b72= Te6edf3deviceTff7b72.Td2a8ffgetIdTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3device_type Tff7b72= Te6edf3deviceTff7b72.Td2a8ffgetTypeTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3channel_counts Tff7b72= Te6edf3deviceTff7b72.Td2a8ffgetChannelCountsTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3channel_countsTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4: Te6edf3channel_counts Tff7b72= Tb4b4b4[T79c0ff1Tb4b4b4, T79c0ff2Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3device_id Tff7b72in Te6edf3added_idsTb4b4b4:
Tff7b72if T79c0ff1 Tff7b72in Te6edf3channel_counts Tff7b72or T79c0ff2 Tff7b72in Te6edf3channel_countsTb4b4b4:
Te6edf3type_description Tff7b72= Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptionsTb4b4b4[Te6edf3device_typeTb4b4b4] Tff7b72if Te6edf3device_type Tff7b72in Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptions Tff7b72else Ta5d6ff"Ta5d6ffUnrecognizedTa5d6ff"
Tff7b72if Tff7b72not Te6edf3type_description Tff7b72in Tff7b72selfTff7b72.Td2a8ffIGNORED_DEVICE_TYPESTb4b4b4:
Te6edf3d Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Te6edf3device_idTb4b4b4, Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffgetProductNameTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Te6edf3device_typeTb4b4b4, Ta5d6ff"Ta5d6fftype_descriptionTa5d6ff"Tb4b4b4: Te6edf3type_descriptionTb4b4b4, Ta5d6ff"Ta5d6ffchannel_countsTa5d6ff"Tb4b4b4: Te6edf3channel_countsTb4b4b4,
Ta5d6ff"Ta5d6ffis_sourceTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffisSourceTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffis_sinkTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffisSinkTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffis_commsTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffis_virtualTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4}
Te6edf3added_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3device_idTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffavailable_devicesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3dTb4b4b4)
Tff7b72if Te6edf3type_description Tff7b72== Ta5d6ff"Ta5d6ffRinger SpeakerTa5d6ff"Tb4b4b4: Te6edf3found_ringer Tff7b72= Tff7b72True
Tff7b72if Te6edf3type_description Tff7b72in Tff7b72selfTff7b72.Td2a8ffADD_VIRT_RINGER_TYPESTb4b4b4:
Te6edf3d Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Te6edf3device_idTff7b72+Tff7b72selfTff7b72.Td2a8ffVIRTUAL_DEVICE_OFFSETTb4b4b4, Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffgetProductNameTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Te6edf3device_typeTb4b4b4, Ta5d6ff"Ta5d6fftype_descriptionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRinger SpeakerTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffchannel_countsTa5d6ff"Tb4b4b4: Te6edf3channel_countsTb4b4b4, Ta5d6ff"Ta5d6ffis_sourceTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffisSourceTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffis_sinkTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffisSinkTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffis_commsTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffis_virtualTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4}
Te6edf3virtual_ringersTff7b72.Td2a8ffappendTb4b4b4(Te6edf3dTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAn error occurred while mapping available communications devices: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Te6edf3available_devices Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffgetDevicesTb4b4b4(Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffGET_DEVICES_ALLTb4b4b4)
Tff7b72for Te6edf3device Tff7b72in Te6edf3available_devicesTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3device_id Tff7b72= Te6edf3deviceTff7b72.Td2a8ffgetIdTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3device_type Tff7b72= Te6edf3deviceTff7b72.Td2a8ffgetTypeTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3channel_counts Tff7b72= Te6edf3deviceTff7b72.Td2a8ffgetChannelCountsTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3channel_countsTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4: Te6edf3channel_counts Tff7b72= Tb4b4b4[T79c0ff1Tb4b4b4, T79c0ff2Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3device_id Tff7b72in Te6edf3added_idsTb4b4b4:
Tff7b72if T79c0ff1 Tff7b72in Te6edf3channel_counts Tff7b72or T79c0ff2 Tff7b72in Te6edf3channel_countsTb4b4b4:
Te6edf3type_description Tff7b72= Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptionsTb4b4b4[Te6edf3device_typeTb4b4b4] Tff7b72if Te6edf3device_type Tff7b72in Tff7b72selfTff7b72.Td2a8ffdevice_type_descriptions Tff7b72else Ta5d6ff"Ta5d6ffUnrecognizedTa5d6ff"
Tff7b72if Tff7b72not Te6edf3type_description Tff7b72in Tff7b72selfTff7b72.Td2a8ffIGNORED_DEVICE_TYPESTb4b4b4:
Te6edf3d Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Te6edf3device_idTb4b4b4, Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffgetProductNameTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Te6edf3device_typeTb4b4b4, Ta5d6ff"Ta5d6fftype_descriptionTa5d6ff"Tb4b4b4: Te6edf3type_descriptionTb4b4b4, Ta5d6ff"Ta5d6ffchannel_countsTa5d6ff"Tb4b4b4: Te6edf3channel_countsTb4b4b4,
Ta5d6ff"Ta5d6ffis_sourceTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffisSourceTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffis_sinkTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffisSinkTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffis_commsTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffis_virtualTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4}
Te6edf3added_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3device_idTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffavailable_devicesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3dTb4b4b4)
Tff7b72if Te6edf3type_description Tff7b72== Ta5d6ff"Ta5d6ffRinger SpeakerTa5d6ff"Tb4b4b4: Te6edf3found_ringer Tff7b72= Tff7b72True
Tff7b72if Te6edf3type_description Tff7b72in Tff7b72selfTff7b72.Td2a8ffADD_VIRT_RINGER_TYPESTb4b4b4:
Te6edf3d Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Te6edf3device_idTff7b72+Tff7b72selfTff7b72.Td2a8ffVIRTUAL_DEVICE_OFFSETTb4b4b4, Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffgetProductNameTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Te6edf3device_typeTb4b4b4, Ta5d6ff"Ta5d6fftype_descriptionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffRinger SpeakerTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffchannel_countsTa5d6ff"Tb4b4b4: Te6edf3channel_countsTb4b4b4, Ta5d6ff"Ta5d6ffis_sourceTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffisSourceTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffis_sinkTa5d6ff"Tb4b4b4: Te6edf3deviceTff7b72.Td2a8ffisSinkTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffis_commsTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffis_virtualTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4}
Te6edf3virtual_ringersTff7b72.Td2a8ffappendTb4b4b4(Te6edf3dTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAn error occurred while mapping available audio devices: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72if Tff7b72not Te6edf3found_ringerTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo native ringer output available on deviceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72for Te6edf3virtual_ringer Tff7b72in Te6edf3virtual_ringersTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAdding virtual ringer Tffd700{Te6edf3virtual_ringerTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffavailable_devicesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3virtual_ringerTb4b4b4)
T8b949e# TODO: Remove debug
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDiscovered audio devices:Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72for Te6edf3d Tff7b72in Tff7b72selfTff7b72.Td2a8ffavailable_devicesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3dTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while initializing Android audio backend: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72def Td2a8ff_shutdownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72pass
Tf0883e@property
Tff7b72def Td2a8ffnameTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ff_client_name
Tf0883e@nameTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffnameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_client_name Tff7b72= Te6edf3name
Tf0883e@property
Tff7b72def Td2a8ffsource_listTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3device_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3d Tff7b72in Tff7b72selfTff7b72.Td2a8ffavailable_devicesTb4b4b4:
Tff7b72if Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffis_sourceTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3type_description Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6fftype_descriptionTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3name Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3did Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]
Te6edf3device_listTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6fffTa5d6ff"Tffd700{Te6edf3type_descriptionTffd700}Ta5d6ff Tffd700{Te6edf3nameTffd700}Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Te6edf3didTb4b4b4}Tb4b4b4)
Tff7b72return Te6edf3device_list
Tff7b72def Td2a8ffsource_infoTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_idTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3d Tff7b72in Tff7b72selfTff7b72.Td2a8ffavailable_devicesTb4b4b4:
Tff7b72if Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3source_idTb4b4b4:
Te6edf3type_description Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6fftype_descriptionTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3name Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3did Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]
Tff7b72if T79c0ff2 Tff7b72in Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffchannel_countsTa5d6ff"Tb4b4b4]Tb4b4b4: Te6edf3channels Tff7b72= T79c0ff2
Tff7b72elif T79c0ff1 Tff7b72in Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffchannel_countsTa5d6ff"Tb4b4b4]Tb4b4b4: Te6edf3channels Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffUnsupported channel count on source Tffd700{Te6edf3type_descriptionTffd700}Ta5d6ff Tffd700{Te6edf3nameTffd700}Ta5d6ff (Tffd700{Te6edf3source_idTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6fflatencyTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ffconfigured_latencyTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ffchannelsTa5d6ff"Tb4b4b4: Te6edf3channelsTb4b4b4, Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6fffTa5d6ff"Tffd700{Te6edf3type_descriptionTffd700}Ta5d6ff Tffd700{Te6edf3nameTffd700}Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdevice.classTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffsoundTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdevice.apiTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffJNITa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdevice.busTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4}
Tff7b72return Tff7b72None
Tf0883e@property
Tff7b72def Td2a8ffsink_listTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3device_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3d Tff7b72in Tff7b72selfTff7b72.Td2a8ffavailable_devicesTb4b4b4:
Tff7b72if Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffis_sinkTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3type_description Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6fftype_descriptionTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3name Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3did Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]
Te6edf3device_listTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6fffTa5d6ff"Tffd700{Te6edf3type_descriptionTffd700}Ta5d6ff Tffd700{Te6edf3nameTffd700}Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Te6edf3didTb4b4b4}Tb4b4b4)
Tff7b72return Te6edf3device_list
Tff7b72def Td2a8ffsink_infoTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sink_idTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3d Tff7b72in Tff7b72selfTff7b72.Td2a8ffavailable_devicesTb4b4b4:
Tff7b72if Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3sink_idTb4b4b4:
Te6edf3type_description Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6fftype_descriptionTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3name Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4; Te6edf3did Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]
Tff7b72if T79c0ff2 Tff7b72in Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffchannel_countsTa5d6ff"Tb4b4b4]Tb4b4b4: Te6edf3channels Tff7b72= T79c0ff2
Tff7b72elif T79c0ff1 Tff7b72in Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffchannel_countsTa5d6ff"Tb4b4b4]Tb4b4b4: Te6edf3channels Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffUnsupported channel count on source Tffd700{Te6edf3type_descriptionTffd700}Ta5d6ff Tffd700{Te6edf3nameTffd700}Ta5d6ff (Tffd700{Te6edf3sink_idTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6fflatencyTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ffconfigured_latencyTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ffchannelsTa5d6ff"Tb4b4b4: Te6edf3channelsTb4b4b4, Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6fffTa5d6ff"Tffd700{Te6edf3type_descriptionTffd700}Ta5d6ff Tffd700{Te6edf3nameTffd700}Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdevice.classTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffsoundTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdevice.apiTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffJNITa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdevice.busTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4}
Tff7b72return Tff7b72None
Tf0883e@property
Tff7b72def Td2a8ffserver_infoTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3default_source_id Tff7b72= Tff7b72None
Te6edf3default_sink_id Tff7b72= Tff7b72None
Tff7b72for Te6edf3d Tff7b72in Tff7b72selfTff7b72.Td2a8ffavailable_devicesTb4b4b4:
Tff7b72if Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6fftype_descriptionTa5d6ff"Tb4b4b4] Tff7b72== Tff7b72selfTff7b72.Td2a8ffDEFAULT_SOURCETb4b4b4:
Te6edf3default_source_id Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]
Tff7b72break
Tff7b72if Tff7b72not Te6edf3default_source_idTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDefault sink not found, searching for fallback...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72for Te6edf3fallback_source Tff7b72in Tff7b72selfTff7b72.Td2a8ffFALLBACK_SOURCESTb4b4b4:
Tff7b72if Te6edf3default_source_id Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72break
Tff7b72for Te6edf3d Tff7b72in Tff7b72selfTff7b72.Td2a8ffavailable_devicesTb4b4b4:
Tff7b72if Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffis_sourceTa5d6ff"Tb4b4b4] Tff7b72== Tff7b72True Tff7b72and Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6fftype_descriptionTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3fallback_sourceTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFound fallback source: Tffd700{Te6edf3fallback_sourceTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3default_source_id Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]
Tff7b72break
Tff7b72for Te6edf3d Tff7b72in Tff7b72selfTff7b72.Td2a8ffavailable_devicesTb4b4b4:
Tff7b72if Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6fftype_descriptionTa5d6ff"Tb4b4b4] Tff7b72== Tff7b72selfTff7b72.Td2a8ffDEFAULT_SINKTb4b4b4:
Te6edf3default_sink_id Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]
Tff7b72break
Tff7b72if Tff7b72not Te6edf3default_sink_idTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDefault sink not found, searching for fallback...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72for Te6edf3fallback_sink Tff7b72in Tff7b72selfTff7b72.Td2a8ffFALLBACK_SINKSTb4b4b4:
Tff7b72if Te6edf3default_sink_id Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72break
Tff7b72for Te6edf3d Tff7b72in Tff7b72selfTff7b72.Td2a8ffavailable_devicesTb4b4b4:
Tff7b72if Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffis_sinkTa5d6ff"Tb4b4b4] Tff7b72== Tff7b72True Tff7b72and Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6fftype_descriptionTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3fallback_sinkTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFound fallback sink: Tffd700{Te6edf3fallback_sinkTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3default_sink_id Tff7b72= Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]
Tff7b72break
Tff7b72if Tff7b72not Te6edf3default_sink_id Tff7b72or Tff7b72not Te6edf3default_source_idTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFailed to find default devices. Available devices on this system are: Tffd700{Tff7b72selfTff7b72.Td2a8ffavailable_devicesTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Tff7b72not Te6edf3default_source_idTb4b4b4: Tff7b72raise Tf85149OSErrorTb4b4b4(Ta5d6ff"Ta5d6ffCould not determine default audio input device, no suitable device availableTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3default_sink_idTb4b4b4: Tff7b72raise Tf85149OSErrorTb4b4b4(Ta5d6ff"Ta5d6ffCould not determine default audio output device, no suitable device availableTa5d6ff"Tb4b4b4)
Te6edf3info Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffserver versionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffserver nameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAndroid AudioTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdefault sink idTa5d6ff"Tb4b4b4: Te6edf3default_sink_idTb4b4b4, Ta5d6ff"Ta5d6ffdefault source idTa5d6ff"Tb4b4b4: Te6edf3default_source_idTb4b4b4}
Tff7b72return Te6edf3info
Te6edf3_audio Tff7b72= Te6edf3_AndroidAudioTb4b4b4(Tb4b4b4)
Te6edf3atexitTff7b72.Td2a8ffregisterTb4b4b4(Te6edf3_audioTff7b72.Td2a8ff_shutdownTb4b4b4)
Tff7b72def Td2a8ffall_speakersTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return Tb4b4b4[Te6edf3_SpeakerTb4b4b4(Tffa657idTff7b72=Te6edf3sTb4b4b4[Ta5d6ff'Ta5d6ffidTa5d6ff'Tb4b4b4]Tb4b4b4) Tff7b72for Te6edf3s Tff7b72in Te6edf3_audioTff7b72.Td2a8ffsink_listTb4b4b4]
Tff7b72def Td2a8ffdefault_speakerTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3name Tff7b72= Te6edf3_audioTff7b72.Td2a8ffserver_infoTb4b4b4[Ta5d6ff"Ta5d6ffdefault sink idTa5d6ff"Tb4b4b4]
Tff7b72return Te6edf3get_speakerTb4b4b4(Te6edf3nameTb4b4b4)
Tff7b72def Td2a8ffget_speakerTb4b4b4(Tffa657idTb4b4b4, Te6edf3low_latencyTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3speakers Tff7b72= Te6edf3_audioTff7b72.Td2a8ffsink_list
Tff7b72return Te6edf3_SpeakerTb4b4b4(Tffa657idTff7b72=Te6edf3_match_soundcardTb4b4b4(Tffa657idTb4b4b4, Te6edf3speakersTb4b4b4)Tb4b4b4[Ta5d6ff'Ta5d6ffidTa5d6ff'Tb4b4b4]Tb4b4b4, Te6edf3low_latencyTff7b72=Te6edf3low_latencyTb4b4b4)
Tff7b72def Td2a8ffall_microphonesTb4b4b4(Te6edf3include_loopbackTff7b72=Tff7b72FalseTb4b4b4, Te6edf3exclude_monitorsTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3exclude_monitorsTb4b4b4: Te6edf3include_loopback Tff7b72= Tff7b72not Te6edf3exclude_monitors
Te6edf3mics Tff7b72= Tb4b4b4[Te6edf3_MicrophoneTb4b4b4(Tffa657idTff7b72=Te6edf3mTb4b4b4[Ta5d6ff'Ta5d6ffidTa5d6ff'Tb4b4b4]Tb4b4b4) Tff7b72for Te6edf3m Tff7b72in Te6edf3_audioTff7b72.Td2a8ffsource_listTb4b4b4]
Tff7b72if Tff7b72not Te6edf3include_loopbackTb4b4b4: Tff7b72return Tb4b4b4[Te6edf3m Tff7b72for Te6edf3m Tff7b72in Te6edf3mics Tff7b72if Te6edf3mTff7b72.Td2a8ff_get_infoTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff'Ta5d6ffdevice.classTa5d6ff'Tb4b4b4] Tff7b72!= Ta5d6ff'Ta5d6ffmonitorTa5d6ff'Tb4b4b4]
Tff7b72elseTb4b4b4: Tff7b72return Te6edf3mics
Tff7b72def Td2a8ffdefault_microphoneTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3name Tff7b72= Te6edf3_audioTff7b72.Td2a8ffserver_infoTb4b4b4[Ta5d6ff'Ta5d6ffdefault source idTa5d6ff'Tb4b4b4]
Tff7b72return Te6edf3get_microphoneTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3include_loopbackTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72def Td2a8ffget_microphoneTb4b4b4(Tffa657idTb4b4b4, Te6edf3include_loopbackTff7b72=Tff7b72FalseTb4b4b4, Te6edf3exclude_monitorsTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3exclude_monitorsTb4b4b4: Te6edf3include_loopback Tff7b72= Tff7b72not Te6edf3exclude_monitors
Te6edf3microphones Tff7b72= Te6edf3_audioTff7b72.Td2a8ffsource_list
Tff7b72return Te6edf3_MicrophoneTb4b4b4(Tffa657idTff7b72=Te6edf3_match_soundcardTb4b4b4(Tffa657idTb4b4b4, Te6edf3microphonesTb4b4b4, Te6edf3include_loopbackTb4b4b4)Tb4b4b4[Ta5d6ff'Ta5d6ffidTa5d6ff'Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8ff_match_soundcardTb4b4b4(Tffa657idTb4b4b4, Te6edf3soundcardsTb4b4b4, Te6edf3include_loopbackTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3soundcards_by_id Tff7b72= Tb4b4b4{Te6edf3soundcardTb4b4b4[Ta5d6ff'Ta5d6ffidTa5d6ff'Tb4b4b4]Tb4b4b4: Te6edf3soundcard Tff7b72for Te6edf3soundcard Tff7b72in Te6edf3soundcardsTb4b4b4}
Te6edf3soundcards_by_name Tff7b72= Tb4b4b4{Te6edf3soundcardTb4b4b4[Ta5d6ff'Ta5d6ffnameTa5d6ff'Tb4b4b4]Tb4b4b4: Te6edf3soundcard Tff7b72for Te6edf3soundcard Tff7b72in Te6edf3soundcardsTb4b4b4}
Tff7b72if Tffa657id Tff7b72in Te6edf3soundcards_by_idTb4b4b4: Tff7b72return Te6edf3soundcards_by_idTb4b4b4[Tffa657idTb4b4b4]
Tff7b72for Te6edf3nameTb4b4b4, Te6edf3soundcard Tff7b72in Te6edf3soundcards_by_nameTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657id Tff7b72in Te6edf3nameTb4b4b4: Tff7b72return Te6edf3soundcard
Te6edf3pattern Tff7b72= Ta5d6ff"Ta5d6ff.*Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Tffa657idTb4b4b4)
Tff7b72for Te6edf3nameTb4b4b4, Te6edf3soundcard Tff7b72in Te6edf3soundcards_by_nameTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3reTff7b72.Td2a8ffmatchTb4b4b4(Te6edf3patternTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4: Tff7b72return Te6edf3soundcard
Tff7b72raise Tf85149IndexErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffno soundcard with id Tffd700{Tffa657idTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffget_nameTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return Te6edf3_audioTff7b72.Td2a8ffname
Tff7b72def Td2a8ffset_nameTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4: Te6edf3_audioTff7b72.Td2a8ffname Tff7b72= Te6edf3name
Tff7b72class T56d364_SoundCardTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Tb4b4b4, Tffa657idTb4b4b4, Te6edf3low_latencyTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_id Tff7b72= Tffa657id
Tff7b72selfTff7b72.Td2a8ff_low_latency Tff7b72= Te6edf3low_latency
Tf0883e@property
Tff7b72def Td2a8ffchannelsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ff_get_infoTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff'Ta5d6ffchannelsTa5d6ff'Tb4b4b4]
Tf0883e@property
Tff7b72def Td2a8ffidTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ff_id
Tf0883e@property
Tff7b72def Td2a8ffnameTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ff_get_infoTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff'Ta5d6ffnameTa5d6ff'Tb4b4b4]
Tff7b72def Td2a8ff_get_infoTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Te6edf3_audioTff7b72.Td2a8ffsource_infoTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_idTb4b4b4)
Tff7b72class T56d364_SpeakerTb4b4b4(Te6edf3_SoundCardTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__repr__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff<Speaker Tffd700{}Ta5d6ff (Tffd700{}Ta5d6ff channels)>Ta5d6ff'Tff7b72.Td2a8ffformatTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)
Tff7b72def Td2a8ffplayerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTff7b72=Tff7b72NoneTb4b4b4, Te6edf3blocksizeTff7b72=Tff7b72NoneTb4b4b4, Te6edf3low_latencyTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3channels Tff7b72is Tff7b72NoneTb4b4b4: Te6edf3channels Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels
Tff7b72return Te6edf3_PlayerTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_idTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTb4b4b4, Te6edf3blocksizeTb4b4b4, Te6edf3low_latencyTb4b4b4)
Tff7b72def Td2a8ffplayTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTff7b72=Tff7b72NoneTb4b4b4, Te6edf3blocksizeTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3channels Tff7b72is Tff7b72NoneTb4b4b4: Te6edf3channels Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels
Tff7b72with Te6edf3_PlayerTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_idTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTb4b4b4, Te6edf3blocksizeTb4b4b4) Tff7b72as Te6edf3sTb4b4b4: Te6edf3sTff7b72.Td2a8ffplayTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72def Td2a8ff_get_infoTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Te6edf3_audioTff7b72.Td2a8ffsink_infoTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_idTb4b4b4)
Tff7b72class T56d364_MicrophoneTb4b4b4(Te6edf3_SoundCardTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__repr__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffisloopbackTb4b4b4: Tff7b72return Ta5d6ff'Ta5d6ff<Loopback Tffd700{}Ta5d6ff (Tffd700{}Ta5d6ff channels)>Ta5d6ff'Tff7b72.Td2a8ffformatTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72return Ta5d6ff'Ta5d6ff<Microphone Tffd700{}Ta5d6ff (Tffd700{}Ta5d6ff channels)>Ta5d6ff'Tff7b72.Td2a8ffformatTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)
Tf0883e@property
Tff7b72def Td2a8ffisloopbackTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffrecorderTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTff7b72=Tff7b72NoneTb4b4b4, Te6edf3blocksizeTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3channels Tff7b72is Tff7b72NoneTb4b4b4: Te6edf3channels Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels
Tff7b72return Te6edf3_RecorderTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_idTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTb4b4b4, Te6edf3blocksizeTb4b4b4)
Tff7b72def Td2a8ffrecordTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3numframesTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTff7b72=Tff7b72NoneTb4b4b4, Te6edf3blocksizeTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3channels Tff7b72is Tff7b72NoneTb4b4b4: Te6edf3channels Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels
Tff7b72with Te6edf3_RecorderTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_idTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTb4b4b4, Te6edf3blocksizeTb4b4b4) Tff7b72as Te6edf3rTb4b4b4: Tff7b72return Te6edf3rTff7b72.Td2a8ffrecordTb4b4b4(Te6edf3numframesTb4b4b4)
Tff7b72class T56d364_StreamTb4b4b4:
Te6edf3TYPE_MAP_FACTOR Tff7b72= Te6edf3numpyTff7b72.Td2a8ffiinfoTb4b4b4(Ta5d6ff"Ta5d6ffint16Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffmax
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tffa657idTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTb4b4b4, Te6edf3blocksizeTff7b72=Tff7b72NoneTb4b4b4, Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffoutputstreamTa5d6ff"Tb4b4b4, Te6edf3low_latencyTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_id Tff7b72= Tffa657id
Tff7b72selfTff7b72.Td2a8ff_samplerate Tff7b72= Te6edf3samplerate
Tff7b72selfTff7b72.Td2a8ff_name Tff7b72= Te6edf3name
Tff7b72selfTff7b72.Td2a8ff_blocksize Tff7b72= Te6edf3blocksize
Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Te6edf3channels
Tff7b72selfTff7b72.Td2a8ffbit_depth Tff7b72= T79c0ff16
Tff7b72selfTff7b72.Td2a8ffaudio_track Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffaudio_record Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffaudio_mode Tff7b72= Ta5d6ff"Ta5d6ffnormalTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffenabled_comms Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fflow_latency_allowed Tff7b72= Te6edf3low_latency
Tff7b72tryTb4b4b4:
Te6edf3Context Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6ffandroid.content.ContextTa5d6ff'Tb4b4b4)
Te6edf3activity Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6fforg.kivy.android.PythonActivityTa5d6ff'Tb4b4b4)Tff7b72.Td2a8ffmActivity
Tff7b72if Te6edf3activity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not obtain application context, instance may be running in a service context.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3android_service Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff'Ta5d6fforg.kivy.android.PythonServiceTa5d6ff'Tb4b4b4)Tff7b72.Td2a8ffmService
Te6edf3activity Tff7b72= Te6edf3android_serviceTff7b72.Td2a8ffgetApplicationTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffgetApplicationContextTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3activity Tff7b72!= Tff7b72NoneTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSuccessfully obtained application context from serviceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Te6edf3activity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFailed to obtain application context for audio stream acquisitionTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo application context available for audio stream acquisitionTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffAudioManager Tff7b72= Te6edf3activityTff7b72.Td2a8ffgetSystemServiceTb4b4b4(Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.AudioManagerTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffAudioTrack Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.AudioTrackTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffAudioFormat Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.AudioFormatTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffAudioDeviceInfo Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.AudioDeviceInfoTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaudio_encoding Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioFormatTff7b72.Td2a8ffENCODING_PCM_16BIT
Tff7b72selfTff7b72.Td2a8ffaudio_track_mode Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioTrackTff7b72.Td2a8ffMODE_STREAM
Te6edf3target_device_info Tff7b72= Tff7b72None
Tff7b72for Te6edf3d Tff7b72in Te6edf3_audioTff7b72.Td2a8ffavailable_devicesTb4b4b4:
Tff7b72if Te6edf3dTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4] Tff7b72== Tff7b72selfTff7b72.Td2a8ff_idTb4b4b4:
Te6edf3target_device_info Tff7b72= Te6edf3d
Tff7b72break
Tff7b72if Tff7b72not Te6edf3target_device_infoTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not acquire target audio device with ID Tffd700{Tff7b72selfTff7b72.Td2a8ff_idTffd700}Ta5d6ff, using fallbackTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaudio_track_profile Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffSTREAM_VOICE_CALL
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffaudio_track_profile Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffSTREAM_VOICE_CALL
T8b949e# We can only select by sink for now, as Android insists on auto-
T8b949e# selecting matching sources in the setCommunicationDevice API
Tff7b72if Te6edf3target_device_infoTb4b4b4[Ta5d6ff"Ta5d6ffis_sinkTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3target_device_id Tff7b72= Te6edf3target_device_infoTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3target_device_infoTb4b4b4[Ta5d6ff"Ta5d6ffis_virtualTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff USING VIRTUAL RINGERTa5d6ff"Tb4b4b4)
Te6edf3target_device_id Tff7b72-Tff7b72= Te6edf3_audioTff7b72.Td2a8ffVIRTUAL_DEVICE_OFFSET
Tff7b72if Te6edf3_audioTff7b72.Td2a8ffandroid_api_version Tff7b72< T79c0ff31Tb4b4b4:
Te6edf3available_devices Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffgetDevicesTb4b4b4(Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffGET_DEVICES_ALLTb4b4b4)
Te6edf3comms_devices Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3available_devices Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffgetDevicesTb4b4b4(Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffGET_DEVICES_ALLTb4b4b4)
Te6edf3comms_devices Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffgetAvailableCommunicationDevicesTb4b4b4(Tb4b4b4)
Te6edf3target_device Tff7b72= Tff7b72None
Te6edf3is_comms_device Tff7b72= Tff7b72False
Te6edf3is_ringer_device Tff7b72= Tff7b72False
Tff7b72for Te6edf3device Tff7b72in Te6edf3comms_devicesTb4b4b4:
Tff7b72if Te6edf3target_device_id Tff7b72== Te6edf3deviceTff7b72.Td2a8ffgetIdTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3target_device Tff7b72= Te6edf3device
Te6edf3is_comms_device Tff7b72= Tff7b72True
Tff7b72break
Tff7b72if Te6edf3target_device Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72for Te6edf3device Tff7b72in Te6edf3available_devicesTb4b4b4:
Tff7b72if Te6edf3target_device_id Tff7b72== Te6edf3deviceTff7b72.Td2a8ffgetIdTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3target_device Tff7b72= Te6edf3device
Te6edf3is_comms_device Tff7b72= Tff7b72False
Tff7b72break
Te6edf3device_id Tff7b72= Te6edf3deviceTff7b72.Td2a8ffgetIdTb4b4b4(Tb4b4b4)
Te6edf3device_type Tff7b72= Te6edf3deviceTff7b72.Td2a8ffgetTypeTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3target_device_infoTb4b4b4[Ta5d6ff"Ta5d6fftype_descriptionTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffRinger SpeakerTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffsetModeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffMODE_NORMALTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaudio_mode Tff7b72= Ta5d6ff"Ta5d6ffringerTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffEnabled ringer audio modeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3_audioTff7b72.Td2a8ffandroid_api_version Tff7b72>Tff7b72= T79c0ff34Tb4b4b4:
Tff7b72if Te6edf3device_type Tff7b72in Te6edf3_audioTff7b72.Td2a8ffdevice_type_descriptions Tff7b72and Te6edf3_audioTff7b72.Td2a8ffdevice_type_descriptionsTb4b4b4[Te6edf3device_typeTb4b4b4] Tff7b72in Te6edf3_audioTff7b72.Td2a8ffCOMMUNICATION_MODE_TYPESTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffsetModeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffMODE_IN_COMMUNICATIONTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaudio_mode Tff7b72= Ta5d6ff"Ta5d6ffcommunicationTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffenabled_comms Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffEnabled communications audio modeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Te6edf3is_comms_deviceTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRunning on API level Tffd700{Te6edf3_audioTff7b72.Td2a8ffandroid_api_versionTffd700}Ta5d6ff, setting via setCommunicationDeviceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffsetCommunicationDeviceTb4b4b4(Te6edf3deviceTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSuccessfully configured communication device to: Tffd700{Te6edf3deviceTffd700}Ta5d6ff / Tffd700{Te6edf3deviceTff7b72.Td2a8ffgetTypeTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffsetModeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffMODE_NORMALTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaudio_mode Tff7b72= Ta5d6ff"Ta5d6ffnormalTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffEnabled normal audio modeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRunning on API level Tffd700{Te6edf3_audioTff7b72.Td2a8ffandroid_api_versionTffd700}Ta5d6ff, setting via setSpeakerphoneOnTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Te6edf3device_type Tff7b72in Te6edf3_audioTff7b72.Td2a8ffdevice_type_descriptions Tff7b72and Te6edf3_audioTff7b72.Td2a8ffdevice_type_descriptionsTb4b4b4[Te6edf3device_typeTb4b4b4] Tff7b72in Te6edf3_audioTff7b72.Td2a8ffCOMMUNICATION_MODE_TYPESTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffsetModeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffMODE_IN_COMMUNICATIONTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffsetSpeakerphoneOnTb4b4b4(Tff7b72FalseTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffEnabled communications audio modeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# API levels < 34, we'll apparently have to set communications mode
T8b949e# no matter what, since otherwise the microphone will be muted.
Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffsetModeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffMODE_IN_COMMUNICATIONTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffsetSpeakerphoneOnTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffEnabled communications audio modeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
T8b949e# for device in available_devices:
T8b949e# device_id = device.getId(); device_type = device.getType()
T8b949e# if target_device_id == device_id:
T8b949e# if _audio.android_api_version >= 34:
T8b949e# RNS.log(f"Running on API level {_audio.android_api_version}, setting via setCommunicationDevice", RNS.LOG_DEBUG)
T8b949e# if device_type in _audio.device_type_descriptions and _audio.device_type_descriptions[device_type] in _audio.COMMUNICATION_MODE_TYPES:
T8b949e# self.AudioManager.setMode(self.AudioManager.MODE_IN_COMMUNICATION)
T8b949e# self.audio_mode = "communication"
T8b949e# self.enabled_comms = True
T8b949e# RNS.log("Enabled communications audio mode", RNS.LOG_DEBUG)
T8b949e# elif target_device_info["type_description"] == "Ringer Speaker":
T8b949e# self.AudioManager.setMode(self.AudioManager.MODE_NORMAL)
T8b949e# self.audio_mode = "ringer"
T8b949e# RNS.log("Enabled ringer audio mode", RNS.LOG_DEBUG)
T8b949e# else:
T8b949e# self.AudioManager.setMode(self.AudioManager.MODE_NORMAL)
T8b949e# self.audio_mode = "normal"
T8b949e# RNS.log("Enabled normal audio mode", RNS.LOG_DEBUG)
T8b949e# if self.AudioManager.setCommunicationDevice(device):
T8b949e# RNS.log(f"Successfully configured communication device to: {device} / {device.getType()}", RNS.LOG_DEBUG)
T8b949e# break
T8b949e# else:
T8b949e# RNS.log(f"Running on API level {_audio.android_api_version}, setting via setSpeakerphoneOn", RNS.LOG_DEBUG)
T8b949e# if device_type in _audio.device_type_descriptions and _audio.device_type_descriptions[device_type] in _audio.COMMUNICATION_MODE_TYPES:
T8b949e# self.AudioManager.setMode(self.AudioManager.MODE_IN_COMMUNICATION)
T8b949e# self.AudioManager.setSpeakerphoneOn(False)
T8b949e# RNS.log("Enabled communications audio mode", RNS.LOG_DEBUG)
T8b949e# else:
T8b949e# # API levels < 34, we'll apparently have to set communications mode
T8b949e# # no matter what, since otherwise the microphone will be muted.
T8b949e# self.AudioManager.setMode(self.AudioManager.MODE_IN_COMMUNICATION)
T8b949e# self.AudioManager.setSpeakerphoneOn(True)
T8b949e# RNS.log("Enabled communications audio mode", RNS.LOG_DEBUG)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffaudio_format_out Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioFormatTff7b72.Td2a8ffCHANNEL_OUT_MONO
Tff7b72selfTff7b72.Td2a8ffaudio_format_in Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioFormatTff7b72.Td2a8ffCHANNEL_IN_MONO
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72== T79c0ff2Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffaudio_format_out Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioFormatTff7b72.Td2a8ffCHANNEL_OUT_STEREO
Tff7b72selfTff7b72.Td2a8ffaudio_format_in Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioFormatTff7b72.Td2a8ffCHANNEL_IN_STEREO
Tff7b72elseTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffUnsupported channel count Tffd700{Te6edf3channelsTffd700}Ta5d6ff on Android audio backendTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmin_buffer_playback Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioTrackTff7b72.Td2a8ffgetMinBufferSizeTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_samplerateTb4b4b4, Tff7b72selfTff7b72.Td2a8ffaudio_format_outTb4b4b4, Tff7b72selfTff7b72.Td2a8ffaudio_encodingTb4b4b4)Tb4b4b4;
Tff7b72selfTff7b72.Td2a8ffmin_buffer_recording Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioTrackTff7b72.Td2a8ffgetMinBufferSizeTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_samplerateTb4b4b4, Tff7b72selfTff7b72.Td2a8ffaudio_format_inTb4b4b4, Tff7b72selfTff7b72.Td2a8ffaudio_encodingTb4b4b4)Tb4b4b4;
Tff7b72selfTff7b72.Td2a8ffbytes_per_sample Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffbit_depthTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*Tff7b72selfTff7b72.Td2a8ffchannels
Tff7b72selfTff7b72.Td2a8ff_samplerate Tff7b72= Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffgetPropertyTb4b4b4(Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffPROPERTY_OUTPUT_SAMPLE_RATETb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffoptimal_frames_per_buffer Tff7b72= Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffgetPropertyTb4b4b4(Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffPROPERTY_OUTPUT_FRAMES_PER_BUFFERTb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not initialize Android audio context for Tffd700{Tff7b72selfTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72def Tff7b72__enter__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4, Te6edf3collectionsTff7b72.Td2a8ffabcTff7b72.Td2a8ffIterableTb4b4b4)Tb4b4b4: Te6edf3channel_count Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)
Tff7b72elif Tffa657isinstanceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4, Tffa657intTb4b4b4)Tb4b4b4: Te6edf3channel_count Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels
Tff7b72elseTb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff'Ta5d6ffchannels must be iterable or integerTa5d6ff'Tb4b4b4)
Te6edf3numchannels Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72if Tffa657isinstanceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4, Tffa657intTb4b4b4) Tff7b72else Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_connect_streamTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffaudio_track Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffaudio_recordTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFailed to acquire audio stream for Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Te6edf3numchannels
Tff7b72return Tff7b72self
Tff7b72def Tff7b72__exit__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3exc_typeTb4b4b4, Te6edf3exc_valueTb4b4b4, Te6edf3tracebackTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffaudio_trackTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffaudio_trackTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaudio_trackTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffaudio_recordTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffaudio_recordTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaudio_recordTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffenabled_commsTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff clearing communication deviceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffAudioManagerTff7b72.Td2a8ffclearCommunicationDeviceTb4b4b4(Tb4b4b4)
Tf0883e@property
Tff7b72def Td2a8fflatencyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e# TODO: Get actual stream latency via JNI here
Tff7b72return T79c0ff0.001
Tff7b72class T56d364_PlayerTb4b4b4(Te6edf3_StreamTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ff_connect_streamTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3AudioAttributes Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.AudioAttributesTa5d6ff"Tb4b4b4)
Te6edf3AudioAttributesBuilder Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.AudioAttributes$BuilderTa5d6ff"Tb4b4b4)
Te6edf3AudioFormat Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.AudioFormatTa5d6ff"Tb4b4b4)
Te6edf3AudioFormatBuilder Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.AudioFormat$BuilderTa5d6ff"Tb4b4b4)
Te6edf3AudioTrack Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.AudioTrackTa5d6ff"Tb4b4b4)
Te6edf3AudioTrackBuilder Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.AudioTrack$BuilderTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_target_buffer_samples Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_play_engaged Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_low_latency Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_low_latency_activated Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_successful_buffer_frames Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_last_underruns Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_write_mode Tff7b72= Te6edf3AudioTrackTff7b72.Td2a8ffWRITE_BLOCKING
Tff7b72selfTff7b72.Td2a8ff_sample_time Tff7b72= T79c0ff1.0Tff7b72/Tff7b72selfTff7b72.Td2a8ff_samplerate
Tff7b72selfTff7b72.Td2a8ff_target_buffer_ms Tff7b72= T79c0ff125
Tff7b72selfTff7b72.Td2a8ff_overrun_wait Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_target_buffer_msTff7b72*T79c0ff0.1Tb4b4b4)Tff7b72/T79c0ff1000
Tff7b72selfTff7b72.Td2a8ff_overrun_lock Tff7b72= T79c0ff0
Te6edf3aa_builder Tff7b72= Te6edf3AudioAttributesBuilderTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffaudio_mode Tff7b72== Ta5d6ff"Ta5d6ffnormalTa5d6ff"Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffEnabling stream properties for normal modeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3aa_builderTff7b72.Td2a8ffsetUsageTb4b4b4(Te6edf3AudioAttributesTff7b72.Td2a8ffUSAGE_MEDIATb4b4b4)
Te6edf3aa_builderTff7b72.Td2a8ffsetContentTypeTb4b4b4(Te6edf3AudioAttributesTff7b72.Td2a8ffCONTENT_TYPE_UNKNOWNTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffperformance_mode Tff7b72= Te6edf3AudioTrackTff7b72.Td2a8ffPERFORMANCE_MODE_LOW_LATENCY
Tff7b72if Tff7b72selfTff7b72.Td2a8fflow_latency_allowedTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_low_latency Tff7b72= Tff7b72True
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffaudio_mode Tff7b72== Ta5d6ff"Ta5d6ffcommunicationTa5d6ff"Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffEnabling stream properties for communication modeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3aa_builderTff7b72.Td2a8ffsetUsageTb4b4b4(Te6edf3AudioAttributesTff7b72.Td2a8ffUSAGE_VOICE_COMMUNICATIONTb4b4b4)
Te6edf3aa_builderTff7b72.Td2a8ffsetContentTypeTb4b4b4(Te6edf3AudioAttributesTff7b72.Td2a8ffCONTENT_TYPE_SPEECHTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffperformance_mode Tff7b72= Te6edf3AudioTrackTff7b72.Td2a8ffPERFORMANCE_MODE_LOW_LATENCY
Tff7b72if Tff7b72selfTff7b72.Td2a8fflow_latency_allowedTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_low_latency Tff7b72= Tff7b72True
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffaudio_mode Tff7b72== Ta5d6ff"Ta5d6ffringerTa5d6ff"Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffEnabling stream properties for ringer modeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3aa_builderTff7b72.Td2a8ffsetUsageTb4b4b4(Te6edf3AudioAttributesTff7b72.Td2a8ffUSAGE_NOTIFICATION_RINGTONETb4b4b4)
Te6edf3aa_builderTff7b72.Td2a8ffsetContentTypeTb4b4b4(Te6edf3AudioAttributesTff7b72.Td2a8ffCONTENT_TYPE_UNKNOWNTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffperformance_mode Tff7b72= Te6edf3AudioTrackTff7b72.Td2a8ffPERFORMANCE_MODE_NONE
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffEnabling stream properties for non-specific modeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3aa_builderTff7b72.Td2a8ffsetUsageTb4b4b4(Te6edf3AudioAttributesTff7b72.Td2a8ffUSAGE_MEDIATb4b4b4)
Te6edf3aa_builderTff7b72.Td2a8ffsetContentTypeTb4b4b4(Te6edf3AudioAttributesTff7b72.Td2a8ffCONTENT_TYPE_UNKNOWNTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffperformance_mode Tff7b72= Te6edf3AudioTrackTff7b72.Td2a8ffPERFORMANCE_MODE_NONE
Te6edf3aa_builderTff7b72.Td2a8ffsetAllowedCapturePolicyTb4b4b4(Te6edf3AudioAttributesTff7b72.Td2a8ffALLOW_CAPTURE_BY_NONETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaudio_attributes Tff7b72= Te6edf3aa_builderTff7b72.Td2a8ffbuildTb4b4b4(Tb4b4b4)
Te6edf3af_builder Tff7b72= Te6edf3AudioFormatBuilderTb4b4b4(Tb4b4b4)
Te6edf3af_builderTff7b72.Td2a8ffsetSampleRateTb4b4b4(Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_samplerateTb4b4b4)Tb4b4b4)
Te6edf3af_builderTff7b72.Td2a8ffsetEncodingTb4b4b4(Tff7b72selfTff7b72.Td2a8ffaudio_encodingTb4b4b4)
Te6edf3af_builderTff7b72.Td2a8ffsetChannelMaskTb4b4b4(Tff7b72selfTff7b72.Td2a8ffaudio_format_outTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaudio_format Tff7b72= Te6edf3af_builderTff7b72.Td2a8ffbuildTb4b4b4(Tb4b4b4)
Te6edf3at_builder Tff7b72= Te6edf3AudioTrackBuilderTb4b4b4(Tb4b4b4)
Te6edf3at_builderTff7b72.Td2a8ffsetAudioAttributesTb4b4b4(Tff7b72selfTff7b72.Td2a8ffaudio_attributesTb4b4b4)
Te6edf3at_builderTff7b72.Td2a8ffsetAudioFormatTb4b4b4(Tff7b72selfTff7b72.Td2a8ffaudio_formatTb4b4b4)
Te6edf3at_builderTff7b72.Td2a8ffsetBufferSizeInBytesTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmin_buffer_playbackTb4b4b4)
Te6edf3at_builderTff7b72.Td2a8ffsetPerformanceModeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffperformance_modeTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaudio_track Tff7b72= Te6edf3at_builderTff7b72.Td2a8ffbuildTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_low_latencyTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_low_latency_setupTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while connecting output audio stream via JNI: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72def Td2a8ffenable_low_latencyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflow_latency_allowed Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_low_latency Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_low_latency_setupTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffaudio_track Tff7b72and Tff7b72selfTff7b72.Td2a8ff_play_engagedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffaudio_trackTff7b72.Td2a8ffsetBufferSizeInFramesTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_target_buffer_samplesTb4b4b4)
Tff7b72def Td2a8ff_low_latency_setupTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3AudioTrack Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.AudioTrackTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_write_mode Tff7b72= Te6edf3AudioTrackTff7b72.Td2a8ffWRITE_NON_BLOCKING
Tff7b72selfTff7b72.Td2a8ff_target_buffer_samples Tff7b72= Tffa657intTb4b4b4(Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_target_buffer_msTff7b72/T79c0ff1000.0Tb4b4b4)Tff7b72/Tb4b4b4(T79c0ff1.0Tff7b72/Tff7b72selfTff7b72.Td2a8ff_samplerateTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaudio_trackTff7b72.Td2a8ffsetBufferSizeInFramesTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_target_buffer_samplesTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_low_latency_activated Tff7b72= Tff7b72True
Tff7b72def Td2a8ffplayTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3frameTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffaudio_trackTb4b4b4: Tff7b72return
Te6edf3input_samples Tff7b72= Te6edf3frameTff7b72*Tff7b72selfTff7b72.Td2a8ffTYPE_MAP_FACTOR
Te6edf3data Tff7b72= Te6edf3input_samplesTff7b72.Td2a8ffastypeTb4b4b4(Te6edf3numpyTff7b72.Td2a8ffint16Tb4b4b4)
Tff7b72if Te6edf3dataTff7b72.Td2a8ffndim Tff7b72== T79c0ff1Tb4b4b4: Te6edf3data Tff7b72= Te6edf3dataTb4b4b4[Tb4b4b4:Tb4b4b4, Tff7b72NoneTb4b4b4] T8b949e# Force 2D array
Tff7b72if Te6edf3dataTff7b72.Td2a8ffndim Tff7b72!= T79c0ff2Tb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffdata must be 1d or 2d, not Tffd700{Te6edf3dataTff7b72.Td2a8ffndimTffd700}Ta5d6ffdTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3dataTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== T79c0ff1 Tff7b72and Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72!= T79c0ff1Tb4b4b4: Te6edf3data Tff7b72= Te6edf3numpyTff7b72.Td2a8fftileTb4b4b4(Te6edf3dataTb4b4b4, Tb4b4b4[T79c0ff1Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3dataTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72!= Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffsecond dimension of data must be equal to the number of channels, not Tffd700{Te6edf3dataTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff1Tb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72while Te6edf3dataTff7b72.Td2a8ffnbytes Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3samples_bytes Tff7b72= Te6edf3dataTff7b72.Td2a8ffravelTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fftobytesTb4b4b4(Tb4b4b4)
Te6edf3written_bytes Tff7b72= Tff7b72selfTff7b72.Td2a8ffaudio_trackTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3samples_bytesTb4b4b4, T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3samples_bytesTb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_write_modeTb4b4b4)
Te6edf3written_samples Tff7b72= Te6edf3written_bytesTff7b72/Tff7b72/Tff7b72selfTff7b72.Td2a8ffbytes_per_sample
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_low_latency_activatedTb4b4b4:
Tff7b72if Te6edf3written_samples Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3written_time Tff7b72= Te6edf3written_samplesTff7b72*Tff7b72selfTff7b72.Td2a8ff_sample_time
Te6edf3min_wait Tff7b72= Te6edf3written_timeTff7b72*T79c0ff0.25
Tff7b72selfTff7b72.Td2a8ff_overrun_lock Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Tb4b4b4(Te6edf3written_timeTff7b72*T79c0ff1.0Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3min_waitTb4b4b4)
Tff7b72if Te6edf3written_bytes Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ff_overrun_lockTb4b4b4:
Te6edf3remaining_frame_samples Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3written_samples Tff7b72= Te6edf3remaining_frame_samples
T8b949e# TODO: Remove debug
T8b949e# RNS.log(f"Buffer overrun. Target buffer samples {self._target_buffer_samples}. Needed to write {remaining_frame_samples} samples / {len(samples_bytes)} bytes. Discarding {written_samples} input samples.")
Te6edf3data Tff7b72= Te6edf3dataTb4b4b4[Te6edf3written_samplesTb4b4b4:Tb4b4b4]
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_play_engagedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffaudio_trackTff7b72.Td2a8ffplayTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_play_engaged Tff7b72= Tff7b72True
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_target_buffer_samplesTb4b4b4: Tff7b72selfTff7b72.Td2a8ffaudio_trackTff7b72.Td2a8ffsetBufferSizeInFramesTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_target_buffer_samplesTb4b4b4)
Te6edf3underruns Tff7b72= Tff7b72selfTff7b72.Td2a8ffaudio_trackTff7b72.Td2a8ffgetUnderrunCountTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3underruns Tff7b72> Tff7b72selfTff7b72.Td2a8ff_last_underrunsTb4b4b4:
Te6edf3delta Tff7b72= Te6edf3underrunsTff7b72-Tff7b72selfTff7b72.Td2a8ff_last_underruns
Tff7b72selfTff7b72.Td2a8ff_last_underruns Tff7b72= Te6edf3underruns
T8b949e# TODO: Remove debug
T8b949e# RNS.log(f"{delta} underruns on {self}")
Tff7b72class T56d364_RecorderTb4b4b4(Te6edf3_StreamTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Te6edf3_RecorderTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffAudioRecord Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.AudioRecordTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pending_chunk Tff7b72= Te6edf3numpyTff7b72.Td2a8ffzerosTb4b4b4(Tb4b4b4(T79c0ff0Tb4b4b4, Tb4b4b4)Tb4b4b4, Te6edf3dtypeTff7b72=Ta5d6ff'Ta5d6fffloat32Ta5d6ff'Tb4b4b4)
Tff7b72def Td2a8ff_connect_streamTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3AudioSource Tff7b72= Te6edf3autoclassTb4b4b4(Ta5d6ff"Ta5d6ffandroid.media.MediaRecorder$AudioSourceTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaudio_record Tff7b72= Tff7b72selfTff7b72.Td2a8ffAudioRecordTb4b4b4(Te6edf3AudioSourceTff7b72.Td2a8ffVOICE_COMMUNICATIONTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_samplerateTb4b4b4, Tff7b72selfTff7b72.Td2a8ffaudio_format_inTb4b4b4, Tff7b72selfTff7b72.Td2a8ffaudio_encodingTb4b4b4, Tff7b72selfTff7b72.Td2a8ffmin_buffer_recordingTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaudio_recordTff7b72.Td2a8ffstartRecordingTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while connecting input audio stream via JNI: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72def Td2a8ff_record_chunkTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3audio_data Tff7b72= Tffa657bytearrayTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmin_buffer_recordingTb4b4b4)
Te6edf3bytes_read Tff7b72= Tff7b72selfTff7b72.Td2a8ffaudio_recordTff7b72.Td2a8ffreadTb4b4b4(Te6edf3audio_dataTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffmin_buffer_recordingTb4b4b4, Tff7b72selfTff7b72.Td2a8ffaudio_recordTff7b72.Td2a8ffREAD_NON_BLOCKINGTb4b4b4)
Tff7b72if Te6edf3bytes_read Tff7b72== T79c0ff0Tb4b4b4: Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.005Tb4b4b4)
Tff7b72if Te6edf3bytes_read Tff7b72== Tff7b72selfTff7b72.Td2a8ffaudio_recordTff7b72.Td2a8ffERROR_INVALID_OPERATIONTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid operation error from JNI on Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elif Te6edf3bytes_read Tff7b72== Tff7b72selfTff7b72.Td2a8ffaudio_recordTff7b72.Td2a8ffERROR_BAD_VALUETb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffBad value error from JNI on Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3recorded_samples Tff7b72= Te6edf3numpyTff7b72.Td2a8fffrombufferTb4b4b4(Te6edf3audio_dataTb4b4b4[Tb4b4b4:Te6edf3bytes_readTb4b4b4]Tb4b4b4, Te6edf3dtypeTff7b72=Ta5d6ff"Ta5d6ffint16Ta5d6ff"Tb4b4b4)Tff7b72/Tff7b72selfTff7b72.Td2a8ffTYPE_MAP_FACTOR
Tff7b72return Te6edf3recorded_samplesTff7b72.Td2a8ffastypeTb4b4b4(Ta5d6ff"Ta5d6fffloat32Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while reading audio chunk: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffrecordTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3numframesTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3numframes Tff7b72is Tff7b72NoneTb4b4b4: Tff7b72return Te6edf3numpyTff7b72.Td2a8ffreshapeTb4b4b4(Te6edf3numpyTff7b72.Td2a8ffconcatenateTb4b4b4(Tb4b4b4[Tff7b72selfTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffravelTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_record_chunkTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4)Tb4b4b4, Tb4b4b4[Tff7b72-T79c0ff1Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3captured_data Tff7b72= Tb4b4b4[Tff7b72selfTff7b72.Td2a8ff_pending_chunkTb4b4b4]
Te6edf3captured_frames Tff7b72= Tff7b72selfTff7b72.Td2a8ff_pending_chunkTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72/ Tff7b72selfTff7b72.Td2a8ffchannels
Tff7b72if Te6edf3captured_frames Tff7b72>Tff7b72= Te6edf3numframesTb4b4b4:
Te6edf3keepTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_pending_chunk Tff7b72= Te6edf3numpyTff7b72.Td2a8ffsplitTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_pending_chunkTb4b4b4, Tb4b4b4[Tffa657intTb4b4b4(Te6edf3numframes Tff7b72* Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)Tb4b4b4]Tb4b4b4)
Tff7b72return Te6edf3numpyTff7b72.Td2a8ffreshapeTb4b4b4(Te6edf3keepTb4b4b4, Tb4b4b4[Tff7b72-T79c0ff1Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72while Te6edf3captured_frames Tff7b72< Te6edf3numframesTb4b4b4:
Te6edf3chunk Tff7b72= Tff7b72selfTff7b72.Td2a8ff_record_chunkTb4b4b4(Tb4b4b4)
Te6edf3captured_dataTff7b72.Td2a8ffappendTb4b4b4(Te6edf3chunkTb4b4b4)
Te6edf3captured_frames Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3chunkTb4b4b4)Tff7b72/Tff7b72selfTff7b72.Td2a8ffchannels
Te6edf3to_split Tff7b72= Tffa657intTb4b4b4(Tffa657lenTb4b4b4(Te6edf3chunkTb4b4b4) Tff7b72- Tb4b4b4(Te6edf3captured_frames Tff7b72- Te6edf3numframesTb4b4b4) Tff7b72* Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)
Te6edf3captured_dataTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_pending_chunk Tff7b72= Te6edf3numpyTff7b72.Td2a8ffsplitTb4b4b4(Te6edf3captured_dataTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4, Tb4b4b4[Te6edf3to_splitTb4b4b4]Tb4b4b4)
Tff7b72return Te6edf3numpyTff7b72.Td2a8ffreshapeTb4b4b4(Te6edf3numpyTff7b72.Td2a8ffconcatenateTb4b4b4(Te6edf3captured_dataTb4b4b4)Tb4b4b4, Tb4b4b4[Tff7b72-T79c0ff1Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4]Tb4b4b4)
Tff7b72def Td2a8ffflushTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3last_chunk Tff7b72= Te6edf3numpyTff7b72.Td2a8ffreshapeTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_pending_chunkTb4b4b4, Tb4b4b4[Tff7b72-T79c0ff1Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pending_chunk Tff7b72= Te6edf3numpyTff7b72.Td2a8ffzerosTb4b4b4(Tb4b4b4(T79c0ff0Tb4b4b4, Tb4b4b4)Tb4b4b4, Te6edf3dtypeTff7b72=Ta5d6ff"Ta5d6fffloat32Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3last_chunk
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────